package br.fatec.model.dao;

import java.util.HashMap;
import java.util.List;

import br.fatec.model.entity.Prescritor;
import br.fatec.util.Globals;
import br.fatec.util.Persistencia;

public class PrescritorDao {
private Persistencia persis;		
	
	public PrescritorDao()
	{
		Globals globals = Globals.getInstance();
		
		this.persis = globals.getPersistencia();
	}
	
	public void cadastrar(Prescritor prescritor) throws Exception
	{	
		persis.cadastrar(prescritor);	
	}
	
	public void alterar(Prescritor prescritor) throws Exception
	{	
		persis.alterar(prescritor);
	}
	
	public void excluir(Prescritor prescritor) throws Exception
	{
		persis.excluir(prescritor.getClass(), prescritor.getCodigo());
	}
	
	public void desativar(Prescritor prescritor) throws Exception {
		prescritor = consultar(prescritor.getCodigo());
		
		prescritor.setAtivo(false);
		
		persis.alterar(prescritor);
	}
	
	public Prescritor consultar(Integer codigo) throws Exception
	{	
		String query = "select * from prescritor where codigo = :codigo and ativo = :ativo";
		
		HashMap<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("codigo", codigo);
		parametros.put("ativo", true);
		
		return (Prescritor)persis.consultar(Prescritor.class, query, parametros);
	}
	
	public Prescritor consultarCpf(String cpf) throws Exception
	{	
		String query = "select * from prescritor where cpf = :cpf and ativo = :ativo";
		
		HashMap<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("cpf", cpf);
		parametros.put("ativo", true);
		
		return (Prescritor)persis.consultar(Prescritor.class, query, parametros);
	}
	
	public Prescritor consultarDocumentoPrescritor(String documentoPrescritor) throws Exception
	{	
		String query = "select * from prescritor where documento_prescritor = :documento_prescritor and ativo = :ativo";
		
		HashMap<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("documento_prescritor", documentoPrescritor);
		parametros.put("ativo", true);
		
		return (Prescritor)persis.consultar(Prescritor.class, query, parametros);
	}
	
	@SuppressWarnings("unchecked")
	public List<Prescritor> listar() throws Exception
	{
		String query = "select * from prescritor where ativo = :ativo order by codigo asc";
		
		HashMap<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("ativo", true);
		
		return (List<Prescritor>)persis.listar(Prescritor.class, query, parametros);
	}
	
	@SuppressWarnings("unchecked")
	public List<Prescritor> listar(String nome) throws Exception {
		String query = "select * from prescritor where nome ilike :nome and ativo = :ativo order by codigo asc";
		
		HashMap<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("nome", "%" +nome+"%");
		parametros.put("ativo", true);

		return (List<Prescritor>) persis.listar(Prescritor.class, query, parametros);
	}
		
	@SuppressWarnings("unchecked")
	public List<Prescritor> filtrar(String codigo, String nome, String cpf, String documentoPrescritor, String email, String telefone) throws Exception {
		String query = "select * from prescritor";

		query += " join (";
		query += " select * from (";
		query += " select *, row_number() over(";
		query += " partition by prescritor_cod )";
		query += " as row_num";
		query += " from prescritor_contato";
		query += " inner join contato on contato.codigo = prescritor_contato.contato_cod";
		
		HashMap<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("ativo", true);
		
		if (telefone != null && !telefone.isEmpty())
		{
			query += " where numero ilike :telefone";
			parametros.put("telefone", "%" +telefone+"%");
		}
		
		query += ") as prescritor_contato_ordenados";
		query += " where prescritor_contato_ordenados.row_num = 1)";
		query += " as prescritor_contato_ordenados_recente";
		query += " on prescritor.codigo = prescritor_contato_ordenados_recente.prescritor_cod";
		
		query += " where prescritor.ativo = :ativo";

		if (codigo != null && !codigo.isEmpty())
		{
			query += " and cast(prescritor.codigo as varchar(50)) ilike :codigo";
			parametros.put("codigo", "%" +codigo+"%");
		}

		if (nome != null && !nome.isEmpty())
		{
			query += " and prescritor.nome ilike :nome";
			parametros.put("nome", "%" +nome+"%");
		}

		if (cpf != null && !cpf.isEmpty())
		{
			query += " and prescritor.cpf ilike :cpf";
			parametros.put("cpf", "%" +cpf+"%");
		}
		
		if (documentoPrescritor != null && !documentoPrescritor.isEmpty())
		{
			query += " and prescritor.documento_prescritor ilike :documento_prescritor";
			parametros.put("documento_prescritor", "%" +documentoPrescritor+"%");
		}

		if (email != null && !email.isEmpty())
		{
			query += " and prescritor.email ilike :email";
			parametros.put("email", "%" +email+"%");
		}
		
		query += " order by prescritor.codigo asc";
		
		return (List<Prescritor>) persis.listar(Prescritor.class, query, parametros);
	}
}
